-- room_mgr.lua
-- 坦克房间管理。
-- 房间建立双索引，任一方的game_clt_id都可以索引到。

local M = { }

local log = require("log"):new("tanks.room_mgr")
local Room = require("tanks.room")

-- 可以改为用 game_clt_id:to_string() 为键，而不是2级table.

-- 建立索引
local function set_clt2room(game_clt_id, room)
    assert(game_clt_id)
    M[game_clt_id:to_string()] = room
end

-- 建立双索引
local function set_kv(key_room, val_room)
    assert(key_room)
    local player1 = key_room.player1
    assert(player1)
    set_clt2room(player1.game_clt_id, val_room)

    local player2 = key_room.player2
    if player2 then
        set_clt2room(player2.game_clt_id, val_room)
    end
end

function M.insert(room)
    set_kv(room, room)
end

function M.erase(room)
    set_kv(room, nil)
end

function M.get(game_clt_id)
    return M[game_clt_id:to_string()]
end

function M.enter(player1, player2)
    assert(player1.account)
    assert(player2.account)
    local room = Room:new(player1, player2)
    M.insert(room)
end

-- 玩家下线事件处理器。
function M.on_disconnected(game_clt_id)
	log:debug("Client(%s) disconnected.", game_clt_id:to_string())

	local room = M.get(game_clt_id)
	if room then
		-- Todo 优雅地结束
		-- room:on_disconnected(game_clt_id)
		M.erase(room)
	end  -- if room
end  -- on_disconnected()

return M
